/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import negocio.Cliente;
import java.util.*;

/**
 *
 * @author JAVA
 */
public class PersistenciaCliente {

    /*
     * crearCliente introduce el cliente que se le introduce, en la base de datos
     */
    public static int crearCliente(Cliente c) {
        int i = 0;
        Statement st = null;
        Connection con = null;
        try {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
                st = con.createStatement();

                //Identifica el último registro de la columna "Id" y obtiene el "id" del último cliente para saber el "id" del que se está introduciendo.
                ResultSet rset = null;
                rset = st.executeQuery("Select id from Cliente");
                int idProximo = 0;
                if (rset.last()) {
                    idProximo = rset.getInt("id") + 1;
                } else {
                    idProximo = 1;
                }
                i = st.executeUpdate("insert into Cliente (id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,baja) VALUES (" + idProximo + ",'" + c.getNombre() + "','" + c.getApellidos() + "','" + c.getDni() + "','" + c.getDomicilio() + "','" + c.getTelefono() + "','" + c.getEmail() + "'," + c.isVip() + ",'" + c.getNomUsuario() + "'," + c.getPin() + ",0)");
            } catch (InstantiationException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    st.close();
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }

    }

    /*
     * eliminaCliente vuelve el indice de baja, del cliente que se le introduce, a 1. Por tanto lo dá de baja.
     */
    public static int eliminarCliente(Cliente c) {
        int i = 0;
        Statement st = null;
        Connection con = null;
        try {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
                st = con.createStatement();
                i = st.executeUpdate("update Cliente set baja='1' where Cliente.id=" + c.getId() + ";");
            } catch (InstantiationException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    st.close();
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }

    public static List<Cliente> obtenerClientes() {
        List<Cliente> listaCliente = new ArrayList<Cliente>();
        try {
            Statement st = null;
            Connection con = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
            st = con.createStatement();
            ResultSet rset = null;
            ArrayList<Cliente> fila = new ArrayList<Cliente>();

            rset = st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.baja='0'");
            while (rset.next()) {
                int id = rset.getInt("id");
                String nombre = rset.getString("nombre");
                String apellidos = rset.getString("apellidos");
                String dni = rset.getString("dni");
                String domicilio = rset.getString("domicilio");
                String telefono = rset.getString("telefono");
                String email = rset.getString("email");
                boolean vip = rset.getBoolean("vip");
                String apodo = rset.getString("nombreusuario");
                int pin = rset.getInt("pin");
                float saldo = rset.getFloat("saldo");
                Cliente c = new Cliente(id, nombre, apellidos, dni, domicilio, telefono, email, apodo, pin);
                c.setVip(vip);
                c.setSaldo(saldo);  
                listaCliente.add(c);
            }
            con.close();
            st.close();
            rset.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        }

        return listaCliente;

    }

    /*
     * seleccionaCliente recibe un entero "modoBusqueda" que indica si el string "s" es un nombre o apellidos o dni, etc..
     * Se utiliza en la clase "GestionCliente-->>buscaClientes(int j)". Donde "j" corresponde despues a "modoBusqueda"
     * en este método.
     * 1>Nombre 2>Apellidos 3>Dni 4>Pin 5>NombreUsuario 6>BusquedaConjunta,NombreUsuarioyPin(Usado en el Login)
     */
    public static ArrayList<Cliente> seleccionaCliente(int modoBusqueda, String s) {
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
        try {
            Statement st = null;
            Connection con = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
            st = con.createStatement();
            ResultSet rset = null;
            ArrayList<Cliente> fila = new ArrayList<Cliente>();
            switch (modoBusqueda) {
                case 1: //Busqueda de Cliente por Nombre
                    rset=st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.baja=0");
                    while (rset.next()) {
                        if (rset.getString("nombre").toLowerCase().contains(s.toLowerCase())) {
                            int id = rset.getInt("id");
                            String nombre = rset.getString("nombre");
                            String apellidos = rset.getString("apellidos");
                            String dni = rset.getString("dni");
                            String domicilio = rset.getString("domicilio");
                            String telefono = rset.getString("telefono");
                            String email = rset.getString("email");
                            boolean vip = rset.getBoolean("vip");
                            String apodo = rset.getString("nombreusuario");
                            int pin = rset.getInt("pin");
                            float saldo = rset.getFloat("saldo");
                            Cliente c = new Cliente(id, nombre, apellidos, dni, domicilio, telefono, email, apodo, pin);
                            c.setVip(vip);
                            c.setSaldo(saldo);
                            fila.add(c);
                        }
                    }
                    break;
                case 2: //Busqueda de Cliente por Apellidos
                    rset=st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.baja=0");
                    while (rset.next()) {
                        if (rset.getString("apellidos").toLowerCase().contains(s.toLowerCase())) {
                            int id = rset.getInt("id");
                            String nombre = rset.getString("nombre");
                            String apellidos = rset.getString("apellidos");
                            String dni = rset.getString("dni");
                            String domicilio = rset.getString("domicilio");
                            String telefono = rset.getString("telefono");
                            String email = rset.getString("email");
                            boolean vip = rset.getBoolean("vip");
                            String apodo = rset.getString("nombreusuario");
                            int pin = rset.getInt("pin");
                            float saldo = rset.getFloat("saldo");
                            Cliente c = new Cliente(id, nombre, apellidos, dni, domicilio, telefono, email, apodo, pin);
                            c.setVip(vip);
                            c.setSaldo(saldo);
                            fila.add(c);
                        }
                    }
                    break;
                case 3: //Busqueda de Cliente por Dni
                    rset = st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.dni='" + s + "' and Cliente.baja=0");
                    break;
                case 4: //Busqueda de Cliente por Id
                    rset = st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.id=" + Integer.parseInt(s) + " and Cliente.baja=0");
                    break;
                case 5: //Busqueda de Cliente por NombreUsuario
                    rset = st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.nombreusuario='" + s + "' and Cliente.baja=0");
                    break;
                case 6: //Busqueda Conjunta de Cliente por Id y NombreUsuario a la vez
                    String s1 = "";
                    String s2 = "";
                    boolean espacio = false;
                    for (int q = 0; q < s.length(); q++) {
                        espacio = s.charAt(q) == ' ' || espacio;
                        if (!espacio) {
                            s1 = s1 + s.charAt(q);
                        } else {
                            s2 = s2 + s.charAt(q);
                        }
                    }
                    rset = st.executeQuery("Select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from Cliente where Cliente.nombreusuario='" + s1 + "' and Cliente.baja=0 and Cliente.pin=" + Integer.parseInt(s2) + "");
                    break;

                default:
                    System.out.println("\n Opcion incorrecta.");
                    break;
            }
            if (modoBusqueda == 1 || modoBusqueda == 2) {
                listaCliente.addAll(fila); //Solo para el ModoBusqueda de  Nombre o Apellidos. Los clientes vienen ya creados, solo se añaden a la listaCliente
            } else {
                while (rset.next()) { //Para los demás ModosBusqueda. Los clientes se crean y se añaden después a la listaCliente
                    int id = rset.getInt("id");
                    String nombre = rset.getString("nombre");
                    String apellidos = rset.getString("apellidos");
                    String dni = rset.getString("dni");
                    String domicilio = rset.getString("domicilio");
                    String telefono = rset.getString("telefono");
                    String email = rset.getString("email");
                    boolean vip = rset.getBoolean("vip");
                    String apodo = rset.getString("nombreusuario");
                    int pin = rset.getInt("pin");
                    float saldo = rset.getFloat("saldo");
                    Cliente c = new Cliente(id, nombre, apellidos, dni, domicilio, telefono, email, apodo, pin);
                    c.setVip(vip);
                    c.setSaldo(saldo);
                    listaCliente.add(c);
                }
            }
            con.close();
            st.close();
            rset.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        }

        return listaCliente;

    }
    /*
     * obtenerCliente Devuelve un Cliente a partir de un NombreUsuario y Pin conjuntamente
     */
    public static Cliente obtenerCliente(String nomusuario, int pin) {
        Cliente c = null;
        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,nombre,apellidos,dni,domicilio,telefono,email,vip,nombreusuario,pin,saldo from cliente where cliente.baja=0 and cliente.nombreusuario='" + nomusuario + "' and cliente.pin=" + pin);
            while (r.next()) {
                c = new Cliente(r.getInt("id"), r.getString("nombre"), r.getString("apellidos"), r.getString("dni"), r.getString("domicilio"), r.getString("telefono"), r.getString("email"), r.getString("nombreusuario"), r.getInt("pin"));
                c.setVip(r.getBoolean("vip"));
                c.setSaldo(r.getFloat("saldo"));

            }
            r.close();
            st.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaProveedor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaProveedor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(PersistenciaProveedor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(PersistenciaProveedor.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return c;
        }
    }


    /*
     * existeCliente devuelve un Entero entre 0 y 3 dependiendo del caso. Para ello
     * pregunta por el Dni, el Nombre de Usuario y el Pin del cliente, si hay algun elemento igual, es que ya existe ese cliente.
     * 0>No hay Coincidencias;  1>Coincide el Dni;  2>Coincide el NombreUsuario;  3>Coincide tanto Dni como NombreUsuario
     */
    public static int existeCliente(Cliente c) {
        Statement st = null;
        Connection con = null;
        int i = 0;
        try {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
                st = con.createStatement();
                ResultSet rset = null;
                rset = st.executeQuery("Select dni,nombreusuario from Cliente where Cliente.dni=" + c.getDni() + " or Cliente.nombreusuario='"+c.getNomUsuario()+"' or Cliente.pin="+c.getPin());
                while (rset.next()) {
                    if (rset.getString("dni").equals(c.getDni())) {
                        i = 1;
                    }
                    if (rset.getString("nombreusuario").equals(c.getNomUsuario())) {
                        i = 2;
                    }
                    if (rset.getString("nombreusuario").equals(c.getNomUsuario())&&rset.getString("dni").equals(c.getDni())){
                        i=3;
                    }
                }
            } catch (InstantiationException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    st.close();
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }

    /*
     * modificaCliente sustituye los atributos del cliente "antiguo" por el String "s" que será el dato nuevo. El Int "modoModificar"
     * indica qué atributo ha de cambiarse. Devuelve un int con los campos modificados (que siempre deberia ser 1)
     * modoModificar:  1>Nombre  2>Apellidos  3>Dni  4>Domicilio  5>Telefono  6>Email  7>Vip  8>NombreUsuario  9>Pin  10>Saldo
     */
    public static int modificaCliente(int modoModificar, Cliente antiguo, String s) {
        Statement st = null;
        Connection con = null;
        int i = 0;
        try {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = DriverManager.getConnection("jdbc:mysql://192.168.1.18/videoclub", "cibernos", "1234");
                st = con.createStatement();

                switch (modoModificar) {
                    case 1:
                        i = st.executeUpdate("update Cliente set nombre='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 2:
                        i = st.executeUpdate("update Cliente set apellidos='" + s + "' where Cliente.id='" + antiguo.getId() + "';");
                        break;
                    case 3:
                        i = st.executeUpdate("update Cliente set dni='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 4:
                        i = st.executeUpdate("update Cliente set domicilio='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 5:
                        i = st.executeUpdate("update Cliente set telefono='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 6:
                        i = st.executeUpdate("update Cliente set email='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 7:
                        i = st.executeUpdate("update Cliente set vip='" + Boolean.parseBoolean(s) + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 8:
                        i = st.executeUpdate("update Cliente set nombreusuario='" + s + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 9:
                        i = st.executeUpdate("update Cliente set pin='" + Integer.parseInt(s) + "' where Cliente.id=" + antiguo.getId() + ";");
                        break;
                    case 10:
                        i = st.executeUpdate("update Cliente set saldo='" + Float.parseFloat(s) + "' where Cliente.id='" + antiguo.getId() + "';");
                        break;
                    default:
                        System.out.println("\n Opcion incorrecta.");
                        break;
                }
            } catch (InstantiationException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                st.close();
                con.close();
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }
}
